Option Explicit

Implements ISql
Implements IExpression
Implements ISqlTableDefine
Implements ISubSelectContainer

'################################################################
' Field
'################################################################
' 当前查询结果表的临时名
Private tempName As String

' 被 union 的多个 select
' List<SelectSql>
Private selectSqls As Collection

' union 的类型
Private fieldUnionType As SqlEnum_SqlUnionType

'################################################################
' Constructor
'################################################################
Private Sub Class_Initialize()
    Set selectSqls = New Collection

    ' 对于一个union，没有真实的表名，在这里生成一个临时表名
    tempName = UtilsRandom.enNumStr(20)
End Sub

Private Sub Class_Terminate()
    Set selectSqls = Nothing
End Sub

'################################################################
' Implements ISql
'################################################################
Public Property Get ISql_SqlType() As SqlEnum_SqlType
    ISql_SqlType = SqlEnum_SqlType.TYPE_UNOIN
End Property

'################################################################
' Implements ISqlTableDefine
'################################################################
' 获取表名
' 对于一个查询/子查询，没有真实的表名，只能返回一个临时表名
' @return List<String>
Public Function ISqlTableDefine_getTableName() As String
    ISqlTableDefine_getTableName = tempName
End Function

' 是否只使用了一个表
Public Function ISqlTableDefine_useSingleTable() As Boolean
    ' TODO
    ' 如果所有 select 中都只使用了一个相同的表，true
    ' 如果所有 select 中都只使用了一个表，但是使用的表不同，false
    ' 如果存在一个 select 使用了多个表， false
End Function

' 检查是否使用表中的所有列
' Public Function ISqlTableDefine_useAllColumn() As Boolean
' End Function

' 获取所有列对象
Public Function ISqlTableDefine_getColumns() As Collection
    ' Noop
    ' TODO
End Function

' 获取所有的筛选条件
Public Function ISqlTableDefine_getCondition() As Collection
    Set ISqlTableDefine_getCondition = Nothing
End Function

' 添加筛选条件
Public Sub ISqlTableDefine_addCondition(ByRef condition As SqlCondition)
    ' Noop
End Sub

'################################################################
' Implements ISubSelectContainer
'################################################################
Public Function ISubSelectContainer_hasSubSelect() As Boolean
    ' 1. if subselect in froms
    ' 2. if subselect in where
End Function

Public Function ISubSelectContainer_getSubSelects() As Collection
    ' 1. if subselect in froms
    ' 2. if subselect in where
End Function

'################################################################
' Property
'################################################################
' 获取所有被 union 的sql
Public Property Get SelectSqlList() As Collection
    Set SelectSqlList = selectSqls
End Property

' 获取被 union 的 sql 数量
Public Property Get SelectSqlCount() As String
    SelectSqlCount = selectSqls.Count
End Property

'################################################################
' Function
'################################################################
' 添加被 union 的 sql
Public Sub addSelectItem(ByRef sql As SelectSql)
    selectSqls.Add sql
End Sub
